//cb1fc581
#include <vector>
#include <string>

using int8		= std::int8_t;
using uint8		= std::uint8_t;
using int16		= std::int16_t;
using uint16	= std::uint16_t;
using int		= std::int32_t;
using uint		= std::uint32_t;
using int32		= std::int32_t;
using uint32	= std::uint32_t;
using int64		= std::int64_t;
using uint64	= std::uint64_t;
using string	= std::string;

template <typename T>
struct RC;

template <typename T>
using array = std::vector<T>;

struct ActionInfo;
struct Android_BindingsMode;
struct sbyte3;
struct ushort2;
struct short3;
struct short2;
struct ushort3;
struct sbyte4;
struct ushort4;
struct GLFW_BindingsMode;
struct uint3;
struct uint4;
struct Android_Input;
struct uint2;
struct float4;
struct float3;
struct float2;
struct WinAPI_BindingsMode;
struct OpenVR_ActionBindings;
struct GLFW_ActionBindings;
struct ubyte2;
struct ubyte3;
struct EGestureType;
struct ubyte4;
struct EGestureState;
struct WinAPI_ActionBindings;
struct OpenVR_Input;
struct WinAPI_Input;
struct EValueType;
struct VecSwizzle;
struct Android_ActionBindings;
struct int4;
struct bool4;
struct int2;
struct bool2;
struct int3;
struct GLFW_Input;
struct bool3;
struct OpenVR_BindingsMode;
struct short4;
struct sbyte2;

using sbyte = int8;
using ubyte = uint8;
using sshort = int16;
using ushort = uint16;
using sint = int;
using slong = int64;
using ulong = uint64;
int  Abs (int x);
int  MirroredWrap (int x, int min, int max);
int  Square (int x);
int  Min (int x, int y);
int  Max (int x, int y);
int  Clamp (int x, int min, int max);
int  Wrap (int x, int min, int max);
int  Average (int x, int y);
int  IntLog2 (int x);
int  CeilIntLog2 (int x);
int  BitScanReverse (int x);
int  BitScanForward (int x);
uint  BitCount (int x);
bool  IsPowerOfTwo (int x);
bool  IsSingleBitSet (int x);
bool  AllBits (int x, int y);
bool  AnyBits (int x, int y);
int  ExtractBit (int & x);
int  ExtractBitIndex (int & x);
int  BitRotateLeft (int x, uint shift);
int  BitRotateRight (int x, uint shift);
int  FloorPOT (int x);
int  CeilPOT (int x);
int  AlignDown (int x, int align);
int  AlignUp (int x, int align);
bool  IsMultipleOf (int x, int align);
uint  Square (uint x);
uint  Min (uint x, uint y);
uint  Max (uint x, uint y);
uint  Clamp (uint x, uint min, uint max);
uint  Wrap (uint x, uint min, uint max);
uint  Average (uint x, uint y);
int  IntLog2 (uint x);
int  CeilIntLog2 (uint x);
int  BitScanReverse (uint x);
int  BitScanForward (uint x);
uint  BitCount (uint x);
bool  IsPowerOfTwo (uint x);
bool  IsSingleBitSet (uint x);
bool  AllBits (uint x, uint y);
bool  AnyBits (uint x, uint y);
uint  ExtractBit (uint & x);
uint  ExtractBitIndex (uint & x);
uint  BitRotateLeft (uint x, uint shift);
uint  BitRotateRight (uint x, uint shift);
uint  FloorPOT (uint x);
uint  CeilPOT (uint x);
uint  AlignDown (uint x, uint align);
uint  AlignUp (uint x, uint align);
bool  IsMultipleOf (uint x, uint align);
float  Abs (float x);
float  MirroredWrap (float x, float min, float max);
float  Square (float x);
float  Min (float x, float y);
float  Max (float x, float y);
float  Clamp (float x, float min, float max);
float  Wrap (float x, float min, float max);
float  Average (float x, float y);
float  Floor (float x);
float  Ceil (float x);
float  Trunc (float x);
float  Fract (float x);
float  Round (float x);
float  Mod (float x, float y);
float  Sqrt (float x);
float  Pow (float x, float pow);
float  Ln (float x);
float  Log (float x, float base);
float  Log2 (float x);
float  Log10 (float x);
float  Exp (float x);
float  Exp2 (float x);
float  Exp10 (float x);
float  ExpMinus1 (float x);
float  Sin (float x);
float  SinH (float x);
float  ASin (float x);
float  Cos (float x);
float  CosH (float x);
float  ACos (float x);
float  Tan (float x);
float  TanH (float x);
float  ATan (float y, float x);
float  ToRad (float x);
float  ToDeg (float x);
float  Lerp (float x, float y, float factor);
float  ToSNorm (float x);
float  ToUNorm (float x);
float  Remap (float srcMin, float srcMax, float dstMin, float dstMax, float x);
float  RemapClamp (float srcMin, float srcMax, float dstMin, float dstMax, float x);
int  RoundToInt (float x);
uint  RoundToUint (float x);
float  IsInfinity (float x);
float  IsNaN (float x);
float  IsFinite (float x);
float  Pi ();
struct bool2
{
	bool2 ();
	bool2 (const bool2&);
	bool2&  operator = (const bool2&);
	bool x;
	bool y;
	bool2 (bool v);
	bool2 (const bool3 & v3);
	bool2 (const bool4 & v4);
	bool2 (bool x, bool y);
	bool2 (const short2 & v2);
	bool2 (const short3 & v3);
	bool2 (const short4 & v4);
	bool2 (const ushort2 & v2);
	bool2 (const ushort3 & v3);
	bool2 (const ushort4 & v4);
	bool2 (const int2 & v2);
	bool2 (const int3 & v3);
	bool2 (const int4 & v4);
	bool2 (const uint2 & v2);
	bool2 (const uint3 & v3);
	bool2 (const uint4 & v4);
	bool2 (const float2 & v2);
	bool2 (const float3 & v3);
	bool2 (const float4 & v4);
};

struct bool3
{
	bool3 ();
	bool3 (const bool3&);
	bool3&  operator = (const bool3&);
	bool x;
	bool y;
	bool z;
	bool3 (bool v);
	bool3 (const bool2 & v2);
	bool3 (const bool4 & v4);
	bool3 (const bool2 & xy, bool z);
	bool3 (bool x, bool y, bool z);
	bool3 (const short2 & v2);
	bool3 (const short3 & v3);
	bool3 (const short4 & v4);
	bool3 (const ushort2 & v2);
	bool3 (const ushort3 & v3);
	bool3 (const ushort4 & v4);
	bool3 (const int2 & v2);
	bool3 (const int3 & v3);
	bool3 (const int4 & v4);
	bool3 (const uint2 & v2);
	bool3 (const uint3 & v3);
	bool3 (const uint4 & v4);
	bool3 (const float2 & v2);
	bool3 (const float3 & v3);
	bool3 (const float4 & v4);
};

struct bool4
{
	bool4 ();
	bool4 (const bool4&);
	bool4&  operator = (const bool4&);
	bool x;
	bool y;
	bool z;
	bool w;
	bool4 (bool v);
	bool4 (const bool2 & v2);
	bool4 (const bool3 & v3);
	bool4 (const bool2 & xy, const bool2 & zw);
	bool4 (const bool3 & xyz, bool w);
	bool4 (bool x, bool y, bool z, bool w);
	bool4 (bool x, const bool3 & yzw);
	bool4 (const short2 & v2);
	bool4 (const short3 & v3);
	bool4 (const short4 & v4);
	bool4 (const ushort2 & v2);
	bool4 (const ushort3 & v3);
	bool4 (const ushort4 & v4);
	bool4 (const int2 & v2);
	bool4 (const int3 & v3);
	bool4 (const int4 & v4);
	bool4 (const uint2 & v2);
	bool4 (const uint3 & v3);
	bool4 (const uint4 & v4);
	bool4 (const float2 & v2);
	bool4 (const float3 & v3);
	bool4 (const float4 & v4);
};

struct sbyte2
{
	sbyte2 ();
	sbyte2 (const sbyte2&);
	sbyte2&  operator = (const sbyte2&);
	int8 x;
	int8 y;
	sbyte2 (int8 v);
	sbyte2 (const sbyte3 & v3);
	sbyte2 (const sbyte4 & v4);
	sbyte2 (int8 x, int8 y);
	sbyte2 (const short2 & v2);
	sbyte2 (const short3 & v3);
	sbyte2 (const short4 & v4);
	sbyte2 (const ushort2 & v2);
	sbyte2 (const ushort3 & v3);
	sbyte2 (const ushort4 & v4);
	sbyte2 (const int2 & v2);
	sbyte2 (const int3 & v3);
	sbyte2 (const int4 & v4);
	sbyte2 (const uint2 & v2);
	sbyte2 (const uint3 & v3);
	sbyte2 (const uint4 & v4);
	sbyte2 (const float2 & v2);
	sbyte2 (const float3 & v3);
	sbyte2 (const float4 & v4);
};

struct sbyte3
{
	sbyte3 ();
	sbyte3 (const sbyte3&);
	sbyte3&  operator = (const sbyte3&);
	int8 x;
	int8 y;
	int8 z;
	sbyte3 (int8 v);
	sbyte3 (const sbyte2 & v2);
	sbyte3 (const sbyte4 & v4);
	sbyte3 (const sbyte2 & xy, int8 z);
	sbyte3 (int8 x, int8 y, int8 z);
	sbyte3 (const short2 & v2);
	sbyte3 (const short3 & v3);
	sbyte3 (const short4 & v4);
	sbyte3 (const ushort2 & v2);
	sbyte3 (const ushort3 & v3);
	sbyte3 (const ushort4 & v4);
	sbyte3 (const int2 & v2);
	sbyte3 (const int3 & v3);
	sbyte3 (const int4 & v4);
	sbyte3 (const uint2 & v2);
	sbyte3 (const uint3 & v3);
	sbyte3 (const uint4 & v4);
	sbyte3 (const float2 & v2);
	sbyte3 (const float3 & v3);
	sbyte3 (const float4 & v4);
};

struct sbyte4
{
	sbyte4 ();
	sbyte4 (const sbyte4&);
	sbyte4&  operator = (const sbyte4&);
	int8 x;
	int8 y;
	int8 z;
	int8 w;
	sbyte4 (int8 v);
	sbyte4 (const sbyte2 & v2);
	sbyte4 (const sbyte3 & v3);
	sbyte4 (const sbyte2 & xy, const sbyte2 & zw);
	sbyte4 (const sbyte3 & xyz, int8 w);
	sbyte4 (int8 x, int8 y, int8 z, int8 w);
	sbyte4 (int8 x, const sbyte3 & yzw);
	sbyte4 (const short2 & v2);
	sbyte4 (const short3 & v3);
	sbyte4 (const short4 & v4);
	sbyte4 (const ushort2 & v2);
	sbyte4 (const ushort3 & v3);
	sbyte4 (const ushort4 & v4);
	sbyte4 (const int2 & v2);
	sbyte4 (const int3 & v3);
	sbyte4 (const int4 & v4);
	sbyte4 (const uint2 & v2);
	sbyte4 (const uint3 & v3);
	sbyte4 (const uint4 & v4);
	sbyte4 (const float2 & v2);
	sbyte4 (const float3 & v3);
	sbyte4 (const float4 & v4);
};

struct ubyte2
{
	ubyte2 ();
	ubyte2 (const ubyte2&);
	ubyte2&  operator = (const ubyte2&);
	uint8 x;
	uint8 y;
	ubyte2 (uint8 v);
	ubyte2 (const ubyte3 & v3);
	ubyte2 (const ubyte4 & v4);
	ubyte2 (uint8 x, uint8 y);
	ubyte2 (const short2 & v2);
	ubyte2 (const short3 & v3);
	ubyte2 (const short4 & v4);
	ubyte2 (const ushort2 & v2);
	ubyte2 (const ushort3 & v3);
	ubyte2 (const ushort4 & v4);
	ubyte2 (const int2 & v2);
	ubyte2 (const int3 & v3);
	ubyte2 (const int4 & v4);
	ubyte2 (const uint2 & v2);
	ubyte2 (const uint3 & v3);
	ubyte2 (const uint4 & v4);
	ubyte2 (const float2 & v2);
	ubyte2 (const float3 & v3);
	ubyte2 (const float4 & v4);
};

struct ubyte3
{
	ubyte3 ();
	ubyte3 (const ubyte3&);
	ubyte3&  operator = (const ubyte3&);
	uint8 x;
	uint8 y;
	uint8 z;
	ubyte3 (uint8 v);
	ubyte3 (const ubyte2 & v2);
	ubyte3 (const ubyte4 & v4);
	ubyte3 (const ubyte2 & xy, uint8 z);
	ubyte3 (uint8 x, uint8 y, uint8 z);
	ubyte3 (const short2 & v2);
	ubyte3 (const short3 & v3);
	ubyte3 (const short4 & v4);
	ubyte3 (const ushort2 & v2);
	ubyte3 (const ushort3 & v3);
	ubyte3 (const ushort4 & v4);
	ubyte3 (const int2 & v2);
	ubyte3 (const int3 & v3);
	ubyte3 (const int4 & v4);
	ubyte3 (const uint2 & v2);
	ubyte3 (const uint3 & v3);
	ubyte3 (const uint4 & v4);
	ubyte3 (const float2 & v2);
	ubyte3 (const float3 & v3);
	ubyte3 (const float4 & v4);
};

struct ubyte4
{
	ubyte4 ();
	ubyte4 (const ubyte4&);
	ubyte4&  operator = (const ubyte4&);
	uint8 x;
	uint8 y;
	uint8 z;
	uint8 w;
	ubyte4 (uint8 v);
	ubyte4 (const ubyte2 & v2);
	ubyte4 (const ubyte3 & v3);
	ubyte4 (const ubyte2 & xy, const ubyte2 & zw);
	ubyte4 (const ubyte3 & xyz, uint8 w);
	ubyte4 (uint8 x, uint8 y, uint8 z, uint8 w);
	ubyte4 (uint8 x, const ubyte3 & yzw);
	ubyte4 (const short2 & v2);
	ubyte4 (const short3 & v3);
	ubyte4 (const short4 & v4);
	ubyte4 (const ushort2 & v2);
	ubyte4 (const ushort3 & v3);
	ubyte4 (const ushort4 & v4);
	ubyte4 (const int2 & v2);
	ubyte4 (const int3 & v3);
	ubyte4 (const int4 & v4);
	ubyte4 (const uint2 & v2);
	ubyte4 (const uint3 & v3);
	ubyte4 (const uint4 & v4);
	ubyte4 (const float2 & v2);
	ubyte4 (const float3 & v3);
	ubyte4 (const float4 & v4);
};

struct short2
{
	short2 ();
	short2 (const short2&);
	short2&  operator = (const short2&);
	int16 x;
	int16 y;
	short2 (int16 v);
	short2 (const short3 & v3);
	short2 (const short4 & v4);
	short2 (int16 x, int16 y);
	short2 (const ushort2 & v2);
	short2 (const ushort3 & v3);
	short2 (const ushort4 & v4);
	short2 (const int2 & v2);
	short2 (const int3 & v3);
	short2 (const int4 & v4);
	short2 (const uint2 & v2);
	short2 (const uint3 & v3);
	short2 (const uint4 & v4);
	short2 (const float2 & v2);
	short2 (const float3 & v3);
	short2 (const float4 & v4);
};

struct short3
{
	short3 ();
	short3 (const short3&);
	short3&  operator = (const short3&);
	int16 x;
	int16 y;
	int16 z;
	short3 (int16 v);
	short3 (const short2 & v2);
	short3 (const short4 & v4);
	short3 (const short2 & xy, int16 z);
	short3 (int16 x, int16 y, int16 z);
	short3 (const ushort2 & v2);
	short3 (const ushort3 & v3);
	short3 (const ushort4 & v4);
	short3 (const int2 & v2);
	short3 (const int3 & v3);
	short3 (const int4 & v4);
	short3 (const uint2 & v2);
	short3 (const uint3 & v3);
	short3 (const uint4 & v4);
	short3 (const float2 & v2);
	short3 (const float3 & v3);
	short3 (const float4 & v4);
};

struct short4
{
	short4 ();
	short4 (const short4&);
	short4&  operator = (const short4&);
	int16 x;
	int16 y;
	int16 z;
	int16 w;
	short4 (int16 v);
	short4 (const short2 & v2);
	short4 (const short3 & v3);
	short4 (const short2 & xy, const short2 & zw);
	short4 (const short3 & xyz, int16 w);
	short4 (int16 x, int16 y, int16 z, int16 w);
	short4 (int16 x, const short3 & yzw);
	short4 (const ushort2 & v2);
	short4 (const ushort3 & v3);
	short4 (const ushort4 & v4);
	short4 (const int2 & v2);
	short4 (const int3 & v3);
	short4 (const int4 & v4);
	short4 (const uint2 & v2);
	short4 (const uint3 & v3);
	short4 (const uint4 & v4);
	short4 (const float2 & v2);
	short4 (const float3 & v3);
	short4 (const float4 & v4);
};

struct ushort2
{
	ushort2 ();
	ushort2 (const ushort2&);
	ushort2&  operator = (const ushort2&);
	uint16 x;
	uint16 y;
	ushort2 (uint16 v);
	ushort2 (const ushort3 & v3);
	ushort2 (const ushort4 & v4);
	ushort2 (uint16 x, uint16 y);
	ushort2 (const short2 & v2);
	ushort2 (const short3 & v3);
	ushort2 (const short4 & v4);
	ushort2 (const int2 & v2);
	ushort2 (const int3 & v3);
	ushort2 (const int4 & v4);
	ushort2 (const uint2 & v2);
	ushort2 (const uint3 & v3);
	ushort2 (const uint4 & v4);
	ushort2 (const float2 & v2);
	ushort2 (const float3 & v3);
	ushort2 (const float4 & v4);
};

struct ushort3
{
	ushort3 ();
	ushort3 (const ushort3&);
	ushort3&  operator = (const ushort3&);
	uint16 x;
	uint16 y;
	uint16 z;
	ushort3 (uint16 v);
	ushort3 (const ushort2 & v2);
	ushort3 (const ushort4 & v4);
	ushort3 (const ushort2 & xy, uint16 z);
	ushort3 (uint16 x, uint16 y, uint16 z);
	ushort3 (const short2 & v2);
	ushort3 (const short3 & v3);
	ushort3 (const short4 & v4);
	ushort3 (const int2 & v2);
	ushort3 (const int3 & v3);
	ushort3 (const int4 & v4);
	ushort3 (const uint2 & v2);
	ushort3 (const uint3 & v3);
	ushort3 (const uint4 & v4);
	ushort3 (const float2 & v2);
	ushort3 (const float3 & v3);
	ushort3 (const float4 & v4);
};

struct ushort4
{
	ushort4 ();
	ushort4 (const ushort4&);
	ushort4&  operator = (const ushort4&);
	uint16 x;
	uint16 y;
	uint16 z;
	uint16 w;
	ushort4 (uint16 v);
	ushort4 (const ushort2 & v2);
	ushort4 (const ushort3 & v3);
	ushort4 (const ushort2 & xy, const ushort2 & zw);
	ushort4 (const ushort3 & xyz, uint16 w);
	ushort4 (uint16 x, uint16 y, uint16 z, uint16 w);
	ushort4 (uint16 x, const ushort3 & yzw);
	ushort4 (const short2 & v2);
	ushort4 (const short3 & v3);
	ushort4 (const short4 & v4);
	ushort4 (const int2 & v2);
	ushort4 (const int3 & v3);
	ushort4 (const int4 & v4);
	ushort4 (const uint2 & v2);
	ushort4 (const uint3 & v3);
	ushort4 (const uint4 & v4);
	ushort4 (const float2 & v2);
	ushort4 (const float3 & v3);
	ushort4 (const float4 & v4);
};

struct int2
{
	int2 ();
	int2 (const int2&);
	int2&  operator = (const int2&);
	int x;
	int y;
	int2 (int v);
	int2 (const int3 & v3);
	int2 (const int4 & v4);
	int2 (int x, int y);
	int2 (const short2 & v2);
	int2 (const short3 & v3);
	int2 (const short4 & v4);
	int2 (const ushort2 & v2);
	int2 (const ushort3 & v3);
	int2 (const ushort4 & v4);
	int2 (const uint2 & v2);
	int2 (const uint3 & v3);
	int2 (const uint4 & v4);
	int2 (const float2 & v2);
	int2 (const float3 & v3);
	int2 (const float4 & v4);
};

struct int3
{
	int3 ();
	int3 (const int3&);
	int3&  operator = (const int3&);
	int x;
	int y;
	int z;
	int3 (int v);
	int3 (const int2 & v2);
	int3 (const int4 & v4);
	int3 (const int2 & xy, int z);
	int3 (int x, int y, int z);
	int3 (const short2 & v2);
	int3 (const short3 & v3);
	int3 (const short4 & v4);
	int3 (const ushort2 & v2);
	int3 (const ushort3 & v3);
	int3 (const ushort4 & v4);
	int3 (const uint2 & v2);
	int3 (const uint3 & v3);
	int3 (const uint4 & v4);
	int3 (const float2 & v2);
	int3 (const float3 & v3);
	int3 (const float4 & v4);
};

struct int4
{
	int4 ();
	int4 (const int4&);
	int4&  operator = (const int4&);
	int x;
	int y;
	int z;
	int w;
	int4 (int v);
	int4 (const int2 & v2);
	int4 (const int3 & v3);
	int4 (const int2 & xy, const int2 & zw);
	int4 (const int3 & xyz, int w);
	int4 (int x, int y, int z, int w);
	int4 (int x, const int3 & yzw);
	int4 (const short2 & v2);
	int4 (const short3 & v3);
	int4 (const short4 & v4);
	int4 (const ushort2 & v2);
	int4 (const ushort3 & v3);
	int4 (const ushort4 & v4);
	int4 (const uint2 & v2);
	int4 (const uint3 & v3);
	int4 (const uint4 & v4);
	int4 (const float2 & v2);
	int4 (const float3 & v3);
	int4 (const float4 & v4);
};

struct uint2
{
	uint2 ();
	uint2 (const uint2&);
	uint2&  operator = (const uint2&);
	uint x;
	uint y;
	uint2 (uint v);
	uint2 (const uint3 & v3);
	uint2 (const uint4 & v4);
	uint2 (uint x, uint y);
	uint2 (const short2 & v2);
	uint2 (const short3 & v3);
	uint2 (const short4 & v4);
	uint2 (const ushort2 & v2);
	uint2 (const ushort3 & v3);
	uint2 (const ushort4 & v4);
	uint2 (const int2 & v2);
	uint2 (const int3 & v3);
	uint2 (const int4 & v4);
	uint2 (const float2 & v2);
	uint2 (const float3 & v3);
	uint2 (const float4 & v4);
};

struct uint3
{
	uint3 ();
	uint3 (const uint3&);
	uint3&  operator = (const uint3&);
	uint x;
	uint y;
	uint z;
	uint3 (uint v);
	uint3 (const uint2 & v2);
	uint3 (const uint4 & v4);
	uint3 (const uint2 & xy, uint z);
	uint3 (uint x, uint y, uint z);
	uint3 (const short2 & v2);
	uint3 (const short3 & v3);
	uint3 (const short4 & v4);
	uint3 (const ushort2 & v2);
	uint3 (const ushort3 & v3);
	uint3 (const ushort4 & v4);
	uint3 (const int2 & v2);
	uint3 (const int3 & v3);
	uint3 (const int4 & v4);
	uint3 (const float2 & v2);
	uint3 (const float3 & v3);
	uint3 (const float4 & v4);
};

struct uint4
{
	uint4 ();
	uint4 (const uint4&);
	uint4&  operator = (const uint4&);
	uint x;
	uint y;
	uint z;
	uint w;
	uint4 (uint v);
	uint4 (const uint2 & v2);
	uint4 (const uint3 & v3);
	uint4 (const uint2 & xy, const uint2 & zw);
	uint4 (const uint3 & xyz, uint w);
	uint4 (uint x, uint y, uint z, uint w);
	uint4 (uint x, const uint3 & yzw);
	uint4 (const short2 & v2);
	uint4 (const short3 & v3);
	uint4 (const short4 & v4);
	uint4 (const ushort2 & v2);
	uint4 (const ushort3 & v3);
	uint4 (const ushort4 & v4);
	uint4 (const int2 & v2);
	uint4 (const int3 & v3);
	uint4 (const int4 & v4);
	uint4 (const float2 & v2);
	uint4 (const float3 & v3);
	uint4 (const float4 & v4);
};

struct float2
{
	float2 ();
	float2 (const float2&);
	float2&  operator = (const float2&);
	float x;
	float y;
	float2 (float v);
	float2 (const float3 & v3);
	float2 (const float4 & v4);
	float2 (float x, float y);
	float2 (const short2 & v2);
	float2 (const short3 & v3);
	float2 (const short4 & v4);
	float2 (const ushort2 & v2);
	float2 (const ushort3 & v3);
	float2 (const ushort4 & v4);
	float2 (const int2 & v2);
	float2 (const int3 & v3);
	float2 (const int4 & v4);
	float2 (const uint2 & v2);
	float2 (const uint3 & v3);
	float2 (const uint4 & v4);
};

struct float3
{
	float3 ();
	float3 (const float3&);
	float3&  operator = (const float3&);
	float x;
	float y;
	float z;
	float3 (float v);
	float3 (const float2 & v2);
	float3 (const float4 & v4);
	float3 (const float2 & xy, float z);
	float3 (float x, float y, float z);
	float3 (const short2 & v2);
	float3 (const short3 & v3);
	float3 (const short4 & v4);
	float3 (const ushort2 & v2);
	float3 (const ushort3 & v3);
	float3 (const ushort4 & v4);
	float3 (const int2 & v2);
	float3 (const int3 & v3);
	float3 (const int4 & v4);
	float3 (const uint2 & v2);
	float3 (const uint3 & v3);
	float3 (const uint4 & v4);
};

struct float4
{
	float4 ();
	float4 (const float4&);
	float4&  operator = (const float4&);
	float x;
	float y;
	float z;
	float w;
	float4 (float v);
	float4 (const float2 & v2);
	float4 (const float3 & v3);
	float4 (const float2 & xy, const float2 & zw);
	float4 (const float3 & xyz, float w);
	float4 (float x, float y, float z, float w);
	float4 (float x, const float3 & yzw);
	float4 (const short2 & v2);
	float4 (const short3 & v3);
	float4 (const short4 & v4);
	float4 (const ushort2 & v2);
	float4 (const ushort3 & v3);
	float4 (const ushort4 & v4);
	float4 (const int2 & v2);
	float4 (const int3 & v3);
	float4 (const int4 & v4);
	float4 (const uint2 & v2);
	float4 (const uint3 & v3);
	float4 (const uint4 & v4);
};

bool  All (const bool2 & x);
bool  Any (const bool2 & x);
bool  All (const bool3 & x);
bool  Any (const bool3 & x);
bool  All (const bool4 & x);
bool  Any (const bool4 & x);
int2  Abs (const int2 & x);
int2  MirroredWrap (const int2 & x, const int2 & min, const int2 & max);
int2  MirroredWrap (const int2 & x, int min, int max);
int  Sum (const int2 & x);
int  Area (const int2 & x);
int2  Min (const int2 & x, const int2 & y);
int2  Max (const int2 & x, const int2 & y);
int2  Clamp (const int2 & val, const int2 & min, const int2 & max);
int2  Clamp (const int2 & val, int min, int max);
int2  Wrap (const int2 & val, const int2 & min, const int2 & max);
int2  Wrap (const int2 & val, int min, int max);
int  VecToLinear (const int2 & pos, const int2 & dim);
int3  Abs (const int3 & x);
int3  MirroredWrap (const int3 & x, const int3 & min, const int3 & max);
int3  MirroredWrap (const int3 & x, int min, int max);
int  Sum (const int3 & x);
int  Area (const int3 & x);
int3  Min (const int3 & x, const int3 & y);
int3  Max (const int3 & x, const int3 & y);
int3  Clamp (const int3 & val, const int3 & min, const int3 & max);
int3  Clamp (const int3 & val, int min, int max);
int3  Wrap (const int3 & val, const int3 & min, const int3 & max);
int3  Wrap (const int3 & val, int min, int max);
int  VecToLinear (const int3 & pos, const int3 & dim);
int4  Abs (const int4 & x);
int4  MirroredWrap (const int4 & x, const int4 & min, const int4 & max);
int4  MirroredWrap (const int4 & x, int min, int max);
int  Sum (const int4 & x);
int  Area (const int4 & x);
int4  Min (const int4 & x, const int4 & y);
int4  Max (const int4 & x, const int4 & y);
int4  Clamp (const int4 & val, const int4 & min, const int4 & max);
int4  Clamp (const int4 & val, int min, int max);
int4  Wrap (const int4 & val, const int4 & min, const int4 & max);
int4  Wrap (const int4 & val, int min, int max);
int  VecToLinear (const int4 & pos, const int4 & dim);
uint  Sum (const uint2 & x);
uint  Area (const uint2 & x);
uint2  Min (const uint2 & x, const uint2 & y);
uint2  Max (const uint2 & x, const uint2 & y);
uint2  Clamp (const uint2 & val, const uint2 & min, const uint2 & max);
uint2  Clamp (const uint2 & val, uint min, uint max);
uint2  Wrap (const uint2 & val, const uint2 & min, const uint2 & max);
uint2  Wrap (const uint2 & val, uint min, uint max);
uint  VecToLinear (const uint2 & pos, const uint2 & dim);
uint  Sum (const uint3 & x);
uint  Area (const uint3 & x);
uint3  Min (const uint3 & x, const uint3 & y);
uint3  Max (const uint3 & x, const uint3 & y);
uint3  Clamp (const uint3 & val, const uint3 & min, const uint3 & max);
uint3  Clamp (const uint3 & val, uint min, uint max);
uint3  Wrap (const uint3 & val, const uint3 & min, const uint3 & max);
uint3  Wrap (const uint3 & val, uint min, uint max);
uint  VecToLinear (const uint3 & pos, const uint3 & dim);
uint  Sum (const uint4 & x);
uint  Area (const uint4 & x);
uint4  Min (const uint4 & x, const uint4 & y);
uint4  Max (const uint4 & x, const uint4 & y);
uint4  Clamp (const uint4 & val, const uint4 & min, const uint4 & max);
uint4  Clamp (const uint4 & val, uint min, uint max);
uint4  Wrap (const uint4 & val, const uint4 & min, const uint4 & max);
uint4  Wrap (const uint4 & val, uint min, uint max);
uint  VecToLinear (const uint4 & pos, const uint4 & dim);
float2  Abs (const float2 & x);
float2  MirroredWrap (const float2 & x, const float2 & min, const float2 & max);
float2  MirroredWrap (const float2 & x, float min, float max);
float  Sum (const float2 & x);
float  Area (const float2 & x);
float2  Min (const float2 & x, const float2 & y);
float2  Max (const float2 & x, const float2 & y);
float2  Clamp (const float2 & val, const float2 & min, const float2 & max);
float2  Clamp (const float2 & val, float min, float max);
float2  Wrap (const float2 & val, const float2 & min, const float2 & max);
float2  Wrap (const float2 & val, float min, float max);
float  VecToLinear (const float2 & pos, const float2 & dim);
float2  ToSNorm (const float2 & x);
float2  ToUNorm (const float2 & x);
float  Dot (const float2 & x, const float2 & y);
float2  Lerp (const float2 & x, const float2 & y, float factor);
float2  Normalize (const float2 & x);
float2  Floor (const float2 & x);
float2  Ceil (const float2 & x);
float2  Round (const float2 & x);
float2  Fract (const float2 & x);
float2  Sqrt (const float2 & x);
float2  Ln (const float2 & x);
float2  Log2 (const float2 & x);
float2  Log (const float2 & x, const float2 & base);
float2  Log (const float2 & x, float base);
float2  Pow (const float2 & x, const float2 & pow);
float2  Pow (const float2 & x, float pow);
float2  Exp (const float2 & x);
float2  Exp2 (const float2 & x);
float2  Exp10 (const float2 & x);
float  Length (const float2 & x);
float  LengthSq (const float2 & x);
float  Distance (const float2 & x, const float2 & y);
float  DistanceSq (const float2 & x, const float2 & y);
float3  Abs (const float3 & x);
float3  MirroredWrap (const float3 & x, const float3 & min, const float3 & max);
float3  MirroredWrap (const float3 & x, float min, float max);
float  Sum (const float3 & x);
float  Area (const float3 & x);
float3  Min (const float3 & x, const float3 & y);
float3  Max (const float3 & x, const float3 & y);
float3  Clamp (const float3 & val, const float3 & min, const float3 & max);
float3  Clamp (const float3 & val, float min, float max);
float3  Wrap (const float3 & val, const float3 & min, const float3 & max);
float3  Wrap (const float3 & val, float min, float max);
float  VecToLinear (const float3 & pos, const float3 & dim);
float3  Cross (const float3 & x, const float3 & y);
float3  ToSNorm (const float3 & x);
float3  ToUNorm (const float3 & x);
float  Dot (const float3 & x, const float3 & y);
float3  Lerp (const float3 & x, const float3 & y, float factor);
float3  Normalize (const float3 & x);
float3  Floor (const float3 & x);
float3  Ceil (const float3 & x);
float3  Round (const float3 & x);
float3  Fract (const float3 & x);
float3  Sqrt (const float3 & x);
float3  Ln (const float3 & x);
float3  Log2 (const float3 & x);
float3  Log (const float3 & x, const float3 & base);
float3  Log (const float3 & x, float base);
float3  Pow (const float3 & x, const float3 & pow);
float3  Pow (const float3 & x, float pow);
float3  Exp (const float3 & x);
float3  Exp2 (const float3 & x);
float3  Exp10 (const float3 & x);
float  Length (const float3 & x);
float  LengthSq (const float3 & x);
float  Distance (const float3 & x, const float3 & y);
float  DistanceSq (const float3 & x, const float3 & y);
float4  Abs (const float4 & x);
float4  MirroredWrap (const float4 & x, const float4 & min, const float4 & max);
float4  MirroredWrap (const float4 & x, float min, float max);
float  Sum (const float4 & x);
float  Area (const float4 & x);
float4  Min (const float4 & x, const float4 & y);
float4  Max (const float4 & x, const float4 & y);
float4  Clamp (const float4 & val, const float4 & min, const float4 & max);
float4  Clamp (const float4 & val, float min, float max);
float4  Wrap (const float4 & val, const float4 & min, const float4 & max);
float4  Wrap (const float4 & val, float min, float max);
float  VecToLinear (const float4 & pos, const float4 & dim);
float4  ToSNorm (const float4 & x);
float4  ToUNorm (const float4 & x);
float  Dot (const float4 & x, const float4 & y);
float4  Lerp (const float4 & x, const float4 & y, float factor);
float4  Normalize (const float4 & x);
float4  Floor (const float4 & x);
float4  Ceil (const float4 & x);
float4  Round (const float4 & x);
float4  Fract (const float4 & x);
float4  Sqrt (const float4 & x);
float4  Ln (const float4 & x);
float4  Log2 (const float4 & x);
float4  Log (const float4 & x, const float4 & base);
float4  Log (const float4 & x, float base);
float4  Pow (const float4 & x, const float4 & pow);
float4  Pow (const float4 & x, float pow);
float4  Exp (const float4 & x);
float4  Exp2 (const float4 & x);
float4  Exp10 (const float4 & x);
float  Length (const float4 & x);
float  LengthSq (const float4 & x);
float  Distance (const float4 & x, const float4 & y);
float  DistanceSq (const float4 & x, const float4 & y);
string  FindAndReplace (const string &, const string &, const string &);
bool  StartsWith (const string &, const string &);
bool  StartsWithIC (const string &, const string &);
bool  EndsWith (const string &, const string &);
bool  EndsWithIC (const string &, const string &);
struct VecSwizzle
{
	VecSwizzle ();
	VecSwizzle (const VecSwizzle&);
	VecSwizzle&  operator = (const VecSwizzle&);
	VecSwizzle (const string & swizzle);
};

struct EGestureState
{
	EGestureState () {}
	EGestureState (uint8) {}
	operator uint8 () const;
	static constexpr uint8 Begin = 0;
	static constexpr uint8 Update = 1;
	static constexpr uint8 End = 2;
	static constexpr uint8 Cancel = 3;
	static constexpr uint8 Outside = 4;
};

struct EGestureType
{
	EGestureType () {}
	EGestureType (uint8) {}
	operator uint8 () const;
	static constexpr uint8 Hold = 3;
	static constexpr uint8 Move = 5;
	static constexpr uint8 LongPress_Move = 6;
	static constexpr uint8 ScaleRotate2D = 7;
	static constexpr uint8 Down = 0;
	static constexpr uint8 Click = 1;
	static constexpr uint8 LongPress = 4;
	static constexpr uint8 DoubleClick = 2;
};

struct EValueType
{
	EValueType () {}
	EValueType (uint8) {}
	operator uint8 () const;
	static constexpr uint8 Unknown = 255;
	static constexpr uint8 Float = 0;
	static constexpr uint8 Float2 = 1;
	static constexpr uint8 Float3 = 2;
	static constexpr uint8 Float4 = 3;
	static constexpr uint8 Quat = 4;
	static constexpr uint8 Float4x4 = 5;
	static constexpr uint8 Chars = 6;
	static constexpr uint8 GNS = 7;
};

struct ActionInfo
{
	ActionInfo ();
	ActionInfo (const ActionInfo&);
	ActionInfo&  operator = (const ActionInfo&);
	ActionInfo (const string &, EValueType);
	ActionInfo (const string &, EValueType, const float4 &);
	ActionInfo (const string &, EGestureType);
	ActionInfo (const string &, EValueType, EGestureType);
	ActionInfo (const string &, EValueType, EGestureType, const float4 &);
	ActionInfo (const string &, EValueType, EGestureType, const VecSwizzle &);
	ActionInfo (const string &, EValueType, EGestureType, const VecSwizzle &, const float4 &);
	EValueType type;
	EGestureType gesture;
	VecSwizzle swizzle;
};

struct GLFW_Input
{
	GLFW_Input () {}
	GLFW_Input (uint16) {}
	operator uint16 () const;
	static constexpr uint16 Space = 32;
	static constexpr uint16 Apostrophe = 39;
	static constexpr uint16 Comma = 44;
	static constexpr uint16 Minus = 45;
	static constexpr uint16 Period = 46;
	static constexpr uint16 Slash = 47;
	static constexpr uint16 0 = 48;
	static constexpr uint16 1 = 49;
	static constexpr uint16 2 = 50;
	static constexpr uint16 3 = 51;
	static constexpr uint16 4 = 52;
	static constexpr uint16 5 = 53;
	static constexpr uint16 6 = 54;
	static constexpr uint16 7 = 55;
	static constexpr uint16 8 = 56;
	static constexpr uint16 9 = 57;
	static constexpr uint16 Semicolon = 59;
	static constexpr uint16 Equal = 61;
	static constexpr uint16 A = 65;
	static constexpr uint16 B = 66;
	static constexpr uint16 C = 67;
	static constexpr uint16 D = 68;
	static constexpr uint16 E = 69;
	static constexpr uint16 F = 70;
	static constexpr uint16 G = 71;
	static constexpr uint16 H = 72;
	static constexpr uint16 I = 73;
	static constexpr uint16 J = 74;
	static constexpr uint16 K = 75;
	static constexpr uint16 L = 76;
	static constexpr uint16 M = 77;
	static constexpr uint16 N = 78;
	static constexpr uint16 O = 79;
	static constexpr uint16 P = 80;
	static constexpr uint16 Q = 81;
	static constexpr uint16 R = 82;
	static constexpr uint16 S = 83;
	static constexpr uint16 T = 84;
	static constexpr uint16 U = 85;
	static constexpr uint16 V = 86;
	static constexpr uint16 W = 87;
	static constexpr uint16 X = 88;
	static constexpr uint16 Y = 89;
	static constexpr uint16 Z = 90;
	static constexpr uint16 LeftBracket = 91;
	static constexpr uint16 BackSlash = 92;
	static constexpr uint16 RightBracket = 93;
	static constexpr uint16 GraveAccent = 96;
	static constexpr uint16 World1 = 161;
	static constexpr uint16 World2 = 162;
	static constexpr uint16 Escape = 256;
	static constexpr uint16 Enter = 257;
	static constexpr uint16 Tab = 258;
	static constexpr uint16 Backspace = 259;
	static constexpr uint16 Insert = 260;
	static constexpr uint16 Delete = 261;
	static constexpr uint16 ArrowRight = 262;
	static constexpr uint16 ArrowLeft = 263;
	static constexpr uint16 ArrowDown = 264;
	static constexpr uint16 ArrowUp = 265;
	static constexpr uint16 PageUp = 266;
	static constexpr uint16 PageDown = 267;
	static constexpr uint16 Home = 268;
	static constexpr uint16 End = 269;
	static constexpr uint16 CapsLock = 280;
	static constexpr uint16 ScrollLock = 281;
	static constexpr uint16 NumLock = 282;
	static constexpr uint16 PrintScreen = 283;
	static constexpr uint16 Pause = 284;
	static constexpr uint16 F1 = 290;
	static constexpr uint16 F2 = 291;
	static constexpr uint16 F3 = 292;
	static constexpr uint16 F4 = 293;
	static constexpr uint16 F5 = 294;
	static constexpr uint16 F6 = 295;
	static constexpr uint16 F7 = 296;
	static constexpr uint16 F8 = 297;
	static constexpr uint16 F9 = 298;
	static constexpr uint16 F10 = 299;
	static constexpr uint16 F11 = 300;
	static constexpr uint16 F12 = 301;
	static constexpr uint16 F13 = 302;
	static constexpr uint16 F14 = 303;
	static constexpr uint16 F15 = 304;
	static constexpr uint16 F16 = 305;
	static constexpr uint16 F17 = 306;
	static constexpr uint16 F18 = 307;
	static constexpr uint16 F19 = 308;
	static constexpr uint16 F20 = 309;
	static constexpr uint16 F21 = 310;
	static constexpr uint16 F22 = 311;
	static constexpr uint16 F23 = 312;
	static constexpr uint16 F24 = 313;
	static constexpr uint16 F25 = 314;
	static constexpr uint16 LeftShift = 340;
	static constexpr uint16 LeftControl = 341;
	static constexpr uint16 LeftAlt = 342;
	static constexpr uint16 LeftSuper = 343;
	static constexpr uint16 RightShift = 344;
	static constexpr uint16 RightControl = 345;
	static constexpr uint16 RightAlt = 346;
	static constexpr uint16 RightSuper = 347;
	static constexpr uint16 Menu = 348;
	static constexpr uint16 KP_0 = 320;
	static constexpr uint16 KP_1 = 321;
	static constexpr uint16 KP_2 = 322;
	static constexpr uint16 KP_3 = 323;
	static constexpr uint16 KP_4 = 324;
	static constexpr uint16 KP_5 = 325;
	static constexpr uint16 KP_6 = 326;
	static constexpr uint16 KP_7 = 327;
	static constexpr uint16 KP_8 = 328;
	static constexpr uint16 KP_9 = 329;
	static constexpr uint16 KP_Decimal = 330;
	static constexpr uint16 KP_Divide = 331;
	static constexpr uint16 KP_Multiply = 332;
	static constexpr uint16 KP_Subtract = 333;
	static constexpr uint16 KP_Add = 334;
	static constexpr uint16 KP_Enter = 335;
	static constexpr uint16 KP_Equal = 336;
	static constexpr uint16 MouseBtn1 = 0;
	static constexpr uint16 MouseBtn2 = 1;
	static constexpr uint16 MouseBtn3 = 2;
	static constexpr uint16 MouseBtn4 = 3;
	static constexpr uint16 MouseBtn5 = 4;
	static constexpr uint16 MouseBtn6 = 5;
	static constexpr uint16 MouseBtn7 = 6;
	static constexpr uint16 MouseBtn8 = 7;
	static constexpr uint16 Accelerometer = 373;
	static constexpr uint16 MagneticField = 377;
	static constexpr uint16 GeoLocation = 381;
	static constexpr uint16 Gyroscope = 375;
	static constexpr uint16 AmbientLight = 369;
	static constexpr uint16 AirPressure = 370;
	static constexpr uint16 Proximity = 371;
	static constexpr uint16 Gravity = 374;
	static constexpr uint16 LinearAcceleration = 376;
	static constexpr uint16 RotationVector = 378;
	static constexpr uint16 RelativeHumidity = 372;
	static constexpr uint16 AirTemperature = 368;
	static constexpr uint16 GameRotationVector = 379;
	static constexpr uint16 Pose6DOF = 380;
	static constexpr uint16 MultiTouch = 358;
	static constexpr uint16 MouseWheel = 359;
	static constexpr uint16 CursorPos = 360;
	static constexpr uint16 CursorPos_mm = 361;
	static constexpr uint16 CursorDelta = 362;
	static constexpr uint16 CursorDelta_norm = 363;
	static constexpr uint16 TouchPos = 364;
	static constexpr uint16 TouchPos_mm = 365;
	static constexpr uint16 TouchDelta = 366;
	static constexpr uint16 TouchDelta_norm = 367;
	static constexpr uint16 MouseLeft = 0;
	static constexpr uint16 MouseRight = 1;
	static constexpr uint16 MouseMiddle = 2;
};

struct GLFW_BindingsMode
{
	GLFW_BindingsMode ();
	void  Add (GLFW_Input, const ActionInfo &);
	void  Inherit (const string &);
	void  LockAndHideCursor ();
};

struct GLFW_ActionBindings
{
	GLFW_ActionBindings ();
	RC<GLFW_BindingsMode>  CreateMode (const string &);
};

struct WinAPI_Input
{
	WinAPI_Input () {}
	WinAPI_Input (uint16) {}
	operator uint16 () const;
	static constexpr uint16 Backspace = 8;
	static constexpr uint16 Tab = 9;
	static constexpr uint16 Clear = 12;
	static constexpr uint16 Enter = 13;
	static constexpr uint16 LeftShift = 16;
	static constexpr uint16 RightShift = 4096;
	static constexpr uint16 LeftCtrl = 17;
	static constexpr uint16 RightCtrl = 4352;
	static constexpr uint16 LeftAlt = 18;
	static constexpr uint16 RightAlt = 4608;
	static constexpr uint16 Pause = 19;
	static constexpr uint16 CapsLock = 20;
	static constexpr uint16 Escape = 27;
	static constexpr uint16 Space = 32;
	static constexpr uint16 PageUp = 8448;
	static constexpr uint16 PageDown = 8704;
	static constexpr uint16 End = 8960;
	static constexpr uint16 Home = 9216;
	static constexpr uint16 ArrowLeft = 9472;
	static constexpr uint16 ArrowUp = 9728;
	static constexpr uint16 ArrowRight = 9984;
	static constexpr uint16 ArrowDown = 10240;
	static constexpr uint16 Select = 41;
	static constexpr uint16 Print = 42;
	static constexpr uint16 Execute = 43;
	static constexpr uint16 Snapshot = 44;
	static constexpr uint16 Insert = 11520;
	static constexpr uint16 Delete = 11776;
	static constexpr uint16 Help = 47;
	static constexpr uint16 0 = 48;
	static constexpr uint16 1 = 49;
	static constexpr uint16 2 = 50;
	static constexpr uint16 3 = 51;
	static constexpr uint16 4 = 52;
	static constexpr uint16 5 = 53;
	static constexpr uint16 6 = 54;
	static constexpr uint16 7 = 55;
	static constexpr uint16 8 = 56;
	static constexpr uint16 9 = 57;
	static constexpr uint16 A = 65;
	static constexpr uint16 B = 66;
	static constexpr uint16 C = 67;
	static constexpr uint16 D = 68;
	static constexpr uint16 E = 69;
	static constexpr uint16 F = 70;
	static constexpr uint16 G = 71;
	static constexpr uint16 H = 72;
	static constexpr uint16 I = 73;
	static constexpr uint16 J = 74;
	static constexpr uint16 K = 75;
	static constexpr uint16 L = 76;
	static constexpr uint16 M = 77;
	static constexpr uint16 N = 78;
	static constexpr uint16 O = 79;
	static constexpr uint16 P = 80;
	static constexpr uint16 Q = 81;
	static constexpr uint16 R = 82;
	static constexpr uint16 S = 83;
	static constexpr uint16 T = 84;
	static constexpr uint16 U = 85;
	static constexpr uint16 V = 86;
	static constexpr uint16 W = 87;
	static constexpr uint16 X = 88;
	static constexpr uint16 Y = 89;
	static constexpr uint16 Z = 90;
	static constexpr uint16 LeftWin = 91;
	static constexpr uint16 RightWin = 23552;
	static constexpr uint16 LeftApps = 93;
	static constexpr uint16 RightApps = 23808;
	static constexpr uint16 Sleep = 95;
	static constexpr uint16 F1 = 112;
	static constexpr uint16 F2 = 113;
	static constexpr uint16 F3 = 114;
	static constexpr uint16 F4 = 115;
	static constexpr uint16 F5 = 116;
	static constexpr uint16 F6 = 117;
	static constexpr uint16 F7 = 118;
	static constexpr uint16 F8 = 119;
	static constexpr uint16 F9 = 120;
	static constexpr uint16 F10 = 121;
	static constexpr uint16 F11 = 122;
	static constexpr uint16 F12 = 123;
	static constexpr uint16 F13 = 124;
	static constexpr uint16 F14 = 125;
	static constexpr uint16 F15 = 126;
	static constexpr uint16 F16 = 127;
	static constexpr uint16 F17 = 128;
	static constexpr uint16 F18 = 129;
	static constexpr uint16 F19 = 130;
	static constexpr uint16 F20 = 131;
	static constexpr uint16 F21 = 132;
	static constexpr uint16 F22 = 133;
	static constexpr uint16 F23 = 134;
	static constexpr uint16 F24 = 135;
	static constexpr uint16 NumLock = 144;
	static constexpr uint16 ScrollLock = 145;
	static constexpr uint16 BrowserBack = 166;
	static constexpr uint16 BrowserForward = 167;
	static constexpr uint16 BrowserRefresh = 168;
	static constexpr uint16 BrowserStop = 169;
	static constexpr uint16 BrowserSearch = 170;
	static constexpr uint16 BrowserFavorites = 171;
	static constexpr uint16 BrowserHome = 172;
	static constexpr uint16 VolumeMute = 173;
	static constexpr uint16 VolumeDown = 174;
	static constexpr uint16 VolumeUp = 175;
	static constexpr uint16 MediaNextTrack = 176;
	static constexpr uint16 MediaPrevTrack = 177;
	static constexpr uint16 MediaStop = 178;
	static constexpr uint16 MediaPlayPause = 179;
	static constexpr uint16 LaunchMail = 180;
	static constexpr uint16 LaunchMediaSelect = 181;
	static constexpr uint16 LaunchApp1 = 182;
	static constexpr uint16 LaunchApp2 = 183;
	static constexpr uint16 Semicolon = 186;
	static constexpr uint16 Equal = 187;
	static constexpr uint16 Comma = 188;
	static constexpr uint16 Minus = 189;
	static constexpr uint16 Period = 190;
	static constexpr uint16 Slash = 191;
	static constexpr uint16 GraveAccent = 192;
	static constexpr uint16 LeftBracket = 219;
	static constexpr uint16 BackSlash = 220;
	static constexpr uint16 RightBracket = 221;
	static constexpr uint16 Apostrophe = 222;
	static constexpr uint16 KP_Enter = 3328;
	static constexpr uint16 KP_0 = 96;
	static constexpr uint16 KP_1 = 97;
	static constexpr uint16 KP_2 = 98;
	static constexpr uint16 KP_3 = 99;
	static constexpr uint16 KP_4 = 100;
	static constexpr uint16 KP_5 = 101;
	static constexpr uint16 KP_6 = 102;
	static constexpr uint16 KP_7 = 103;
	static constexpr uint16 KP_8 = 104;
	static constexpr uint16 KP_9 = 105;
	static constexpr uint16 KP_Multiply = 106;
	static constexpr uint16 KP_Add = 107;
	static constexpr uint16 KP_Separator = 108;
	static constexpr uint16 KP_Subtract = 109;
	static constexpr uint16 KP_Decimal = 110;
	static constexpr uint16 KP_Divide = 111;
	static constexpr uint16 KP_Divide2 = 28416;
	static constexpr uint16 KP_End = 35;
	static constexpr uint16 KP_ArrowLeft = 37;
	static constexpr uint16 KP_ArrowUp = 38;
	static constexpr uint16 KP_ArrowRight = 39;
	static constexpr uint16 KP_ArrowDown = 40;
	static constexpr uint16 KP_Home = 36;
	static constexpr uint16 KP_PageUp = 33;
	static constexpr uint16 KP_PageDown = 34;
	static constexpr uint16 KP_Insert = 45;
	static constexpr uint16 KP_Delete = 46;
	static constexpr uint16 MouseBtn0 = 0;
	static constexpr uint16 MouseBtn1 = 1;
	static constexpr uint16 MouseBtn2 = 2;
	static constexpr uint16 MouseBtn3 = 3;
	static constexpr uint16 MouseBtn4 = 4;
	static constexpr uint16 MultiTouch = 57098;
	static constexpr uint16 MouseWheel = 57099;
	static constexpr uint16 CursorPos = 57100;
	static constexpr uint16 CursorPos_mm = 57101;
	static constexpr uint16 CursorDelta = 57102;
	static constexpr uint16 CursorDelta_norm = 57103;
	static constexpr uint16 TouchPos = 57104;
	static constexpr uint16 TouchPos_mm = 57105;
	static constexpr uint16 TouchDelta = 57106;
	static constexpr uint16 TouchDelta_norm = 57107;
	static constexpr uint16 MouseLeft = 0;
	static constexpr uint16 MouseRight = 1;
	static constexpr uint16 MouseMiddle = 2;
};

struct WinAPI_BindingsMode
{
	WinAPI_BindingsMode ();
	void  Add (WinAPI_Input, const ActionInfo &);
	void  Inherit (const string &);
	void  LockAndHideCursor ();
};

struct WinAPI_ActionBindings
{
	WinAPI_ActionBindings ();
	RC<WinAPI_BindingsMode>  CreateMode (const string &);
};

struct Android_Input
{
	Android_Input () {}
	Android_Input (uint16) {}
	operator uint16 () const;
	static constexpr uint16 Back = 4;
	static constexpr uint16 0 = 7;
	static constexpr uint16 1 = 8;
	static constexpr uint16 2 = 9;
	static constexpr uint16 3 = 10;
	static constexpr uint16 4 = 11;
	static constexpr uint16 5 = 12;
	static constexpr uint16 6 = 13;
	static constexpr uint16 7 = 14;
	static constexpr uint16 8 = 15;
	static constexpr uint16 9 = 16;
	static constexpr uint16 Star = 17;
	static constexpr uint16 Paund = 18;
	static constexpr uint16 VolumeUp = 24;
	static constexpr uint16 VolumeDown = 25;
	static constexpr uint16 VolumeMute = 164;
	static constexpr uint16 Power = 26;
	static constexpr uint16 Camera = 27;
	static constexpr uint16 Clear = 28;
	static constexpr uint16 A = 29;
	static constexpr uint16 B = 30;
	static constexpr uint16 C = 31;
	static constexpr uint16 D = 32;
	static constexpr uint16 E = 33;
	static constexpr uint16 F = 34;
	static constexpr uint16 G = 35;
	static constexpr uint16 H = 36;
	static constexpr uint16 I = 37;
	static constexpr uint16 J = 38;
	static constexpr uint16 K = 39;
	static constexpr uint16 L = 40;
	static constexpr uint16 M = 41;
	static constexpr uint16 N = 42;
	static constexpr uint16 O = 43;
	static constexpr uint16 P = 44;
	static constexpr uint16 Q = 45;
	static constexpr uint16 R = 46;
	static constexpr uint16 S = 47;
	static constexpr uint16 T = 48;
	static constexpr uint16 U = 49;
	static constexpr uint16 V = 50;
	static constexpr uint16 W = 51;
	static constexpr uint16 X = 52;
	static constexpr uint16 Y = 53;
	static constexpr uint16 Z = 54;
	static constexpr uint16 Comma = 55;
	static constexpr uint16 Period = 56;
	static constexpr uint16 LeftAlt = 57;
	static constexpr uint16 RightAlt = 58;
	static constexpr uint16 LeftShift = 59;
	static constexpr uint16 RightShift = 60;
	static constexpr uint16 Tab = 61;
	static constexpr uint16 Space = 62;
	static constexpr uint16 Sym = 63;
	static constexpr uint16 Browser = 64;
	static constexpr uint16 LaunchMail = 65;
	static constexpr uint16 Enter = 66;
	static constexpr uint16 Delete = 67;
	static constexpr uint16 Grave = 68;
	static constexpr uint16 Minus = 69;
	static constexpr uint16 Equal = 70;
	static constexpr uint16 LeftBracket = 71;
	static constexpr uint16 RightBracket = 72;
	static constexpr uint16 BackSlash = 73;
	static constexpr uint16 Semicolon = 74;
	static constexpr uint16 Apostrophe = 75;
	static constexpr uint16 Slash = 76;
	static constexpr uint16 At = 77;
	static constexpr uint16 Num = 78;
	static constexpr uint16 Plus = 81;
	static constexpr uint16 Menu = 82;
	static constexpr uint16 Notification = 83;
	static constexpr uint16 Search = 84;
	static constexpr uint16 MicMute = 91;
	static constexpr uint16 PageUp = 92;
	static constexpr uint16 PageDown = 93;
	static constexpr uint16 PictSymbols = 94;
	static constexpr uint16 SwitchCharset = 95;
	static constexpr uint16 Escape = 111;
	static constexpr uint16 ForwardDelete = 112;
	static constexpr uint16 LeftControl = 113;
	static constexpr uint16 RightControl = 114;
	static constexpr uint16 CapsLock = 115;
	static constexpr uint16 ScrollLock = 116;
	static constexpr uint16 LeftMeta = 117;
	static constexpr uint16 RightMeta = 118;
	static constexpr uint16 Function = 119;
	static constexpr uint16 SysRq = 120;
	static constexpr uint16 PauseBreak = 121;
	static constexpr uint16 MoveHome = 122;
	static constexpr uint16 MoveEnd = 123;
	static constexpr uint16 Insert = 124;
	static constexpr uint16 Forward = 125;
	static constexpr uint16 F1 = 131;
	static constexpr uint16 F2 = 132;
	static constexpr uint16 F3 = 133;
	static constexpr uint16 F4 = 134;
	static constexpr uint16 F5 = 135;
	static constexpr uint16 F6 = 136;
	static constexpr uint16 F7 = 137;
	static constexpr uint16 F8 = 138;
	static constexpr uint16 F9 = 139;
	static constexpr uint16 F10 = 140;
	static constexpr uint16 F11 = 141;
	static constexpr uint16 F12 = 142;
	static constexpr uint16 NumLock = 143;
	static constexpr uint16 Info = 165;
	static constexpr uint16 ChannelUp = 166;
	static constexpr uint16 ChannelDown = 167;
	static constexpr uint16 ZoomIn = 168;
	static constexpr uint16 ZoomOut = 169;
	static constexpr uint16 Window = 171;
	static constexpr uint16 Guide = 172;
	static constexpr uint16 DVR = 173;
	static constexpr uint16 Bookmark = 174;
	static constexpr uint16 Captions = 175;
	static constexpr uint16 Settings = 176;
	static constexpr uint16 AppSwitch = 187;
	static constexpr uint16 LangSwitch = 204;
	static constexpr uint16 MannerMode = 205;
	static constexpr uint16 3DMode = 206;
	static constexpr uint16 Contacts = 207;
	static constexpr uint16 Calendar = 208;
	static constexpr uint16 Music = 209;
	static constexpr uint16 Calculator = 210;
	static constexpr uint16 ZenkakuHankaku = 211;
	static constexpr uint16 Eisu = 212;
	static constexpr uint16 Muhenkan = 213;
	static constexpr uint16 Henkan = 214;
	static constexpr uint16 KatakanaHiragana = 215;
	static constexpr uint16 Yen = 216;
	static constexpr uint16 Ro = 217;
	static constexpr uint16 Kana = 218;
	static constexpr uint16 Assist = 219;
	static constexpr uint16 BrightnessDown = 220;
	static constexpr uint16 BrightnessUp = 221;
	static constexpr uint16 Sleep = 223;
	static constexpr uint16 Wakeup = 224;
	static constexpr uint16 Pairing = 225;
	static constexpr uint16 11 = 227;
	static constexpr uint16 12 = 228;
	static constexpr uint16 LastChannel = 229;
	static constexpr uint16 VoiceAssist = 231;
	static constexpr uint16 Help = 259;
	static constexpr uint16 NavPrev = 260;
	static constexpr uint16 NavNext = 261;
	static constexpr uint16 NavIn = 262;
	static constexpr uint16 NavOut = 263;
	static constexpr uint16 StemPrimary = 264;
	static constexpr uint16 Stem1 = 265;
	static constexpr uint16 Stem2 = 266;
	static constexpr uint16 Stem3 = 267;
	static constexpr uint16 SoftSleep = 276;
	static constexpr uint16 Cut = 277;
	static constexpr uint16 Copy = 278;
	static constexpr uint16 Paste = 279;
	static constexpr uint16 SysNavUp = 280;
	static constexpr uint16 SysNavDown = 281;
	static constexpr uint16 SysNavLeft = 282;
	static constexpr uint16 SysNavRight = 283;
	static constexpr uint16 AllApps = 284;
	static constexpr uint16 Refresh = 285;
	static constexpr uint16 ThumbsUp = 286;
	static constexpr uint16 ThumbsDown = 287;
	static constexpr uint16 ProfileSwitch = 288;
	static constexpr uint16 MediaPlayPause = 85;
	static constexpr uint16 MediaStop = 86;
	static constexpr uint16 MediaNext = 87;
	static constexpr uint16 MediaPrev = 88;
	static constexpr uint16 MediaRewind = 89;
	static constexpr uint16 MediaFastForward = 90;
	static constexpr uint16 MediaPlay = 126;
	static constexpr uint16 MediaPause = 127;
	static constexpr uint16 MediaClose = 128;
	static constexpr uint16 MediaEject = 129;
	static constexpr uint16 MediaRecord = 130;
	static constexpr uint16 MediaAudioTrack = 222;
	static constexpr uint16 MediaTopMenu = 226;
	static constexpr uint16 MediaSkipForward = 272;
	static constexpr uint16 MediaSkipBackward = 273;
	static constexpr uint16 MediaStepForward = 274;
	static constexpr uint16 MediaStepBackward = 275;
	static constexpr uint16 DPadUp = 19;
	static constexpr uint16 DPadDown = 20;
	static constexpr uint16 DPadLeft = 21;
	static constexpr uint16 DPadRight = 22;
	static constexpr uint16 DPadCenter = 23;
	static constexpr uint16 DPadUpLeft = 268;
	static constexpr uint16 DPadDownLeft = 269;
	static constexpr uint16 DPadUpRight = 270;
	static constexpr uint16 DPadDownRight = 271;
	static constexpr uint16 GPadA = 96;
	static constexpr uint16 GPadB = 97;
	static constexpr uint16 GPadC = 98;
	static constexpr uint16 GPadX = 99;
	static constexpr uint16 GPadY = 100;
	static constexpr uint16 GPadZ = 101;
	static constexpr uint16 GPadL1 = 102;
	static constexpr uint16 GPadR1 = 103;
	static constexpr uint16 GPadL2 = 104;
	static constexpr uint16 GPadR2 = 105;
	static constexpr uint16 GPadThumbL = 106;
	static constexpr uint16 GPadThumbR = 107;
	static constexpr uint16 GPadStart = 108;
	static constexpr uint16 GPadSelect = 109;
	static constexpr uint16 GPadMode = 110;
	static constexpr uint16 GPad1 = 188;
	static constexpr uint16 GPad2 = 189;
	static constexpr uint16 GPad3 = 190;
	static constexpr uint16 GPad4 = 191;
	static constexpr uint16 GPad5 = 192;
	static constexpr uint16 GPad6 = 193;
	static constexpr uint16 GPad7 = 194;
	static constexpr uint16 GPad8 = 195;
	static constexpr uint16 GPad9 = 196;
	static constexpr uint16 GPad10 = 197;
	static constexpr uint16 GPad11 = 198;
	static constexpr uint16 GPad12 = 199;
	static constexpr uint16 GPad13 = 200;
	static constexpr uint16 GPad14 = 201;
	static constexpr uint16 GPad15 = 202;
	static constexpr uint16 GPad16 = 203;
	static constexpr uint16 KP_0 = 144;
	static constexpr uint16 KP_1 = 145;
	static constexpr uint16 KP_2 = 146;
	static constexpr uint16 KP_3 = 147;
	static constexpr uint16 KP_4 = 148;
	static constexpr uint16 KP_5 = 149;
	static constexpr uint16 KP_6 = 150;
	static constexpr uint16 KP_7 = 151;
	static constexpr uint16 KP_8 = 152;
	static constexpr uint16 KP_9 = 153;
	static constexpr uint16 KP_Divide = 154;
	static constexpr uint16 KP_Multiply = 155;
	static constexpr uint16 KP_Subtract = 156;
	static constexpr uint16 KP_Add = 157;
	static constexpr uint16 KP_Dot = 158;
	static constexpr uint16 KP_Comma = 159;
	static constexpr uint16 KP_Enter = 160;
	static constexpr uint16 KP_Equal = 161;
	static constexpr uint16 KP_LeftParen = 162;
	static constexpr uint16 KP_RightParen = 163;
	static constexpr uint16 TV = 170;
	static constexpr uint16 TV_Power = 177;
	static constexpr uint16 TV_Input = 178;
	static constexpr uint16 TV_STBPower = 179;
	static constexpr uint16 TV_STBInput = 180;
	static constexpr uint16 AV_Power = 181;
	static constexpr uint16 AVR_Input = 182;
	static constexpr uint16 TV_ProgRed = 183;
	static constexpr uint16 TV_ProgGreen = 184;
	static constexpr uint16 TV_ProgYellow = 185;
	static constexpr uint16 TV_ProgBlue = 186;
	static constexpr uint16 TV_DataService = 230;
	static constexpr uint16 TV_RadioService = 232;
	static constexpr uint16 TV_Teletext = 233;
	static constexpr uint16 TV_NumberEntry = 234;
	static constexpr uint16 TV_TerrestrialAnalog = 235;
	static constexpr uint16 TV_TerrestrialDigital = 236;
	static constexpr uint16 TV_Satellite = 237;
	static constexpr uint16 TV_SatelliteBS = 238;
	static constexpr uint16 TV_SattelliteCS = 239;
	static constexpr uint16 TV_SatelliteService = 240;
	static constexpr uint16 TV_Network = 241;
	static constexpr uint16 TV_AntennaCable = 242;
	static constexpr uint16 TV_InputHdmi1 = 243;
	static constexpr uint16 TV_InputHdmi2 = 244;
	static constexpr uint16 TV_InputHdmi3 = 245;
	static constexpr uint16 TV_InputHdmi4 = 246;
	static constexpr uint16 TV_inputComposite1 = 247;
	static constexpr uint16 TV_inputComposite2 = 248;
	static constexpr uint16 TV_InputComponent1 = 249;
	static constexpr uint16 TV_InputComponent2 = 250;
	static constexpr uint16 TV_InputVGA1 = 251;
	static constexpr uint16 TV_AudioDesc = 252;
	static constexpr uint16 TV_AudioDescMixUp = 253;
	static constexpr uint16 TV_AudioDescMixDown = 254;
	static constexpr uint16 TV_ZoomMode = 255;
	static constexpr uint16 TV_ContentsMenu = 256;
	static constexpr uint16 TV_MediaContextMenu = 257;
	static constexpr uint16 TV_TimerProgramming = 258;
	static constexpr uint16 Accelerometer = 532;
	static constexpr uint16 MagneticField = 536;
	static constexpr uint16 GeoLocation = 540;
	static constexpr uint16 Gyroscope = 534;
	static constexpr uint16 AmbientLight = 528;
	static constexpr uint16 AirPressure = 529;
	static constexpr uint16 Proximity = 530;
	static constexpr uint16 Gravity = 533;
	static constexpr uint16 LinearAcceleration = 535;
	static constexpr uint16 RotationVector = 537;
	static constexpr uint16 RelativeHumidity = 531;
	static constexpr uint16 AirTemperature = 527;
	static constexpr uint16 GameRotationVector = 538;
	static constexpr uint16 Pose6DOF = 539;
	static constexpr uint16 MultiTouch = 522;
	static constexpr uint16 TouchPos = 523;
	static constexpr uint16 TouchPos_mm = 524;
	static constexpr uint16 TouchDelta = 525;
	static constexpr uint16 TouchDelta_norm = 526;
};

struct Android_BindingsMode
{
	Android_BindingsMode ();
	void  Add (Android_Input, const ActionInfo &);
	void  Inherit (const string &);
};

struct Android_ActionBindings
{
	Android_ActionBindings ();
	RC<Android_BindingsMode>  CreateMode (const string &);
};

struct OpenVR_Input
{
	OpenVR_Input () {}
	OpenVR_Input (uint16) {}
	operator uint16 () const;
};

struct OpenVR_BindingsMode
{
	OpenVR_BindingsMode ();
	void  Add (OpenVR_Input, const ActionInfo &);
	void  Inherit (const string &);
};

struct OpenVR_ActionBindings
{
	OpenVR_ActionBindings ();
	RC<OpenVR_BindingsMode>  CreateMode (const string &);
};

template <>
struct RC<Android_BindingsMode> : Android_BindingsMode
{
	RC (const Android_BindingsMode &);
};

template <>
struct RC<GLFW_BindingsMode> : GLFW_BindingsMode
{
	RC (const GLFW_BindingsMode &);
};

template <>
struct RC<WinAPI_BindingsMode> : WinAPI_BindingsMode
{
	RC (const WinAPI_BindingsMode &);
};

template <>
struct RC<OpenVR_ActionBindings> : OpenVR_ActionBindings
{
	RC (const OpenVR_ActionBindings &);
};

template <>
struct RC<GLFW_ActionBindings> : GLFW_ActionBindings
{
	RC (const GLFW_ActionBindings &);
};

template <>
struct RC<WinAPI_ActionBindings> : WinAPI_ActionBindings
{
	RC (const WinAPI_ActionBindings &);
};

template <>
struct RC<Android_ActionBindings> : Android_ActionBindings
{
	RC (const Android_ActionBindings &);
};

template <>
struct RC<OpenVR_BindingsMode> : OpenVR_BindingsMode
{
	RC (const OpenVR_BindingsMode &);
};

